/**
 * 牛牛冲钻五
 *
 * 题目描述
 * 牛牛最近在玩炉石传说，这是一款一对一对战的卡牌游戏，牛牛打算努力冲上钻五分段，获得丰厚的天梯奖励。
 *
 * 炉石传说的段位可以用星数来表示，具体规则为：若牛牛本场失败，则扣除一星；若牛牛本场获胜，需要看牛牛
 * 是否触发了连胜奖励，若牛牛获得了至少三连胜（即本局对局的上一局和上上局都获胜）则获
 * k星，否则获得一星。现在给出牛牛游玩的 n场记录，请你判断牛牛最终的星数和初始星数的差。
 *
 * 输入描述:
 * 第一行输入一个整数T(1≤T≤10^4)，测试组数。
 * 每个测试的第一行输入两个整数
 * n(3≤n≤10^5)和k(2≤k≤100)，牛牛共打了几场比赛与连胜奖励的星数。
 * 接下来一行输入一个长为n的字符串，
 * 之中W表示获胜，L表示失败，保证只含有这两种字母。
 * 保证所有用例的Σn≤10^5
 *
 * 输出描述:
 * 对每个测试用例，输出一个整数，表示牛牛最终的星数和初始星数的差。
 */

import java.util.Scanner;

/**
 * 直接求出连胜和输的场次就可以了, 然后减去这两个数就是普通胜利
 * 的场次
 * 时间复杂度 : O(n)
 * 空间复杂度 : O(1)
 */

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        // z 组
        int z = in.nextInt();

        while (z-- != 0) {

            int n = in.nextInt(), k = in.nextInt();
            char[] nums = in.next().toCharArray();

            // w : 连胜场次   l : 输的场次
            int w = 0, l = 0;

            for (int i = 0; i < n; i++) {

                // 要是 nums[i] == W , 开始判断是否连胜
                if (nums[i] == 'W') {

                    // 连胜左边界
                    int left = i;

                    // 找出连胜的右边界
                    //  这里要注意下标是否会越界
                    while (i < n && nums[i] == 'W') {
                        i++;
                    }

                    // 这里场次只要大于 3 就表示连胜开始
                    // 这里可以举例子来看下连胜的场次怎么算
                    if (i - left >= 3) {
                        w += i - left - 3 + 1;
                    }

                    // 不要忘记时下标回来一个, 因为回到上面还要 ++ 一次
                    i--;
                } else {

                    // 不是就是输的场次 ++
                    l++;
                }
            }

            // 打印结果的时候也要注意, 这里总的场次减去 连胜和 输的场次就是普通赢的场次
            // 然后再加上连胜的奖励 减去 输掉掉的星, 就是最终的结果
            System.out.println(n - w - l + w * k - l);
        }
    }
}